//
// Created by Leaf on 2025/8/18.
//

#ifndef PIR_MOTION_H
#define PIR_MOTION_H

#include <Arduino.h>
#include <cstdint>

// 定义PIR运动检测回调函数类型
typedef void (*PIRMotionCallback)();

class PIRMotion {
public:
    explicit PIRMotion(uint8_t pin);
    void begin(bool useInterrupt = true, uint8_t interruptPriority = 1);
    bool isDetected();
    static void motionDetectedISR();
    void onMotionDetected(PIRMotionCallback callback);  // 注册运动检测回调函数

private:
    uint8_t pir_pin;
    bool use_interrupt;
    static PIRMotionCallback motion_callback;  // 运动检测回调函数指针
    static volatile bool motion_detected;
};

#endif //PIR_MOTION_H

/**使用示例*************************
// 定义回调函数
void myMotionCallback() {
    Serial.println("Motion detected!");
}

// 使用默认中断模式并注册回调函数
PIRMotion pir_sensor(PIR_PIN);
pir_sensor.onMotionDetected(myMotionCallback);  // 注册回调函数
pir_sensor.begin();

// 使用轮询模式
PIRMotion pir_sensor2(PIR_PIN);
pir_sensor2.begin(false);

// 使用中断模式并设置优先级
PIRMotion pir_sensor3(PIR_PIN);
pir_sensor3.onMotionDetected(myMotionCallback);  // 注册回调函数
pir_sensor3.begin(true, 3);
*/